filechooser: Check that icons exist
authorMatthias Clasen <mclasen@redhat.com>
Fri, 26 Mar 2021 17:15:19 +0000 (13:15 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 26 Mar 2021 17:17:51 +0000 (13:17 -0400)
Otherwise we end up showing missing-image in the
file chooser, and thats sad.

gtk/gtkfilechooserutils.c
gtk/gtkfilechooserutils.h
gtk/gtkfilechooserwidget.c

index de3ffa15d5863c69d10414b03f7b04fc5b00cb50..af319303a04f8d1e503cd7b4a462a1024e1d613b 100644 (file)
@@ -447,9 +447,10 @@ _gtk_file_consider_as_remote (GFile *file)
 }
 
 GIcon *
-_gtk_file_info_get_icon (GFileInfo *info,
-                         int        icon_size,
-                         int        scale)
+_gtk_file_info_get_icon (GFileInfo    *info,
+                         int           icon_size,
+                         int           scale,
+                         GtkIconTheme *icon_theme)
 {
   GIcon *icon;
   GdkPixbuf *pixbuf;
@@ -468,7 +469,7 @@ _gtk_file_info_get_icon (GFileInfo *info,
     }
 
   icon = g_file_info_get_icon (info);
-  if (icon)
+  if (icon && gtk_icon_theme_has_gicon (icon_theme, icon))
     return g_object_ref (icon);
 
   /* Use general fallback for all files without icon */
index 46625b6c864bf2f372683542bf32da8a26c4c1ac..9481704ad98c80f53610fb3f062474b2e94a148d 100644 (file)
@@ -21,6 +21,7 @@
 #define __GTK_FILE_CHOOSER_UTILS_H__
 
 #include "gtkfilechooserprivate.h"
+#include "gtkicontheme.h"
 
 G_BEGIN_DECLS
 
@@ -52,9 +53,10 @@ char * _gtk_file_chooser_label_for_file (GFile *file);
 gboolean        _gtk_file_info_consider_as_directory (GFileInfo *info);
 gboolean        _gtk_file_has_native_path (GFile *file);
 gboolean        _gtk_file_consider_as_remote (GFile *file);
-GIcon *               _gtk_file_info_get_icon    (GFileInfo *info,
-                                                  int        icon_size,
-                                                  int        scale);
+GIcon *         _gtk_file_info_get_icon    (GFileInfo    *info,
+                                            int           icon_size,
+                                            int           scale,
+                                            GtkIconTheme *icon_theme);
 
 G_END_DECLS
 
index f6a58f32185164f4439e7481c299d4c8e4e4c2a8..6f612c1c630dc84fb036dae0ff1571a03658caff 100644 (file)
@@ -4448,7 +4448,13 @@ file_system_model_set (GtkFileSystemModel *model,
         {
           if (g_file_info_has_attribute (info, G_FILE_ATTRIBUTE_STANDARD_ICON))
             {
-              g_value_take_object (value, _gtk_file_info_get_icon (info, ICON_SIZE, gtk_widget_get_scale_factor (GTK_WIDGET (impl))));
+              int scale;
+              GtkIconTheme *icon_theme;
+
+              scale = gtk_widget_get_scale_factor (GTK_WIDGET (impl));
+              icon_theme = gtk_icon_theme_get_for_display (gtk_widget_get_display (GTK_WIDGET (impl)));
+
+              g_value_take_object (value, _gtk_file_info_get_icon (info, ICON_SIZE, scale, icon_theme));
             }
           else
             {